const _ = require("lodash");
const { prisma } = require("../utils/db");

// 薪资范围
const salaryRange = [
  {
    min: 1,
    max: 5,
  },
  {
    min: 5,
    max: 8,
  },
  {
    min: 8,
    max: 12,
  },
  {
    min: 12,
    max: 16,
  },
  {
    min: 16,
    max: 20,
  },
  {
    min: 20,
    max: 30,
  },
  {
    min: 30,
    max: 50,
  },
];

/**
 * 统计学历
 * @returns
 */
const groupDegree = async () => {
  const data = await prisma.job0905.groupBy({
    where: {},
    by: "jobDegree",
    _count: {
      jobDegree: true,
    },
    orderBy: {
      _count: {
        jobDegree: "desc",
      },
    },
  });
  return data.map((item) => {
    return {
      keyword: item.jobDegree,
      count: item._count.jobDegree,
    };
  });
};

/**
 * 统计薪资范围
 * @returns
 */
const groupSalary = async () => {
  // const data = await prisma.job0905.groupBy({
  //   where: {},
  //   by: "salaryDesc",
  //   _count: {
  //     salaryDesc: true,
  //   },
  //   orderBy: {
  //     _count: {
  //       salaryDesc: "desc",
  //     },
  //   },
  //   having: {
  //     salaryDesc: {
  //       _count: {
  //         gte: 5, // 统计薪资范围在两百以上的
  //       },
  //     },
  //   },
  // });
  const data = await prisma.job0905.findMany({});
  const res = [];
  salaryRange.forEach((cd) => {
    //
    res.push({
      keyword: cd.min + "-" + cd.max + "K",
      count: data.filter((j) => {
        // j.salaryDesc.toLowerCase().includes(cd.toLowerCase()) {
        if (!j.salaryDesc.toLocaleLowerCase().includes("k")) {
          return cd.min === 1;
        } else {
          try {
            const tmpArr = j.salaryDesc.split("-");
            const tmpMin = tmpArr[0];
            const tmpMax = tmpArr[1].toLowerCase().split("k")[0];
            // console.log(tmpMin, tmpMax);
            if (cd.min <= tmpMin && tmpMax <= cd.max) {
              return true;
            } else {
              return false;
            }
          } catch (err) {
            return false;
          }
        }
      }).length,
    });
  });
  return res;
};

/**
 * 城市分布，岗位数大于50个的
 * @returns
 */
const groupCity = async () => {
  const data = await prisma.job0905.groupBy({
    by: ["cityName", "city"],
    _count: {
      cityName: true,
    },
    orderBy: {
      _count: {
        city: "desc",
      },
    },
    // 条件暂时先不加
    // where: {
    //   OR: [
    //     {
    //       skills: {
    //         contains: "Vue",
    //       },
    //     },
    //     {
    //       skills: {
    //         contains: "vue",
    //       },
    //     },
    //     {
    //       skills: {
    //         contains: "React",
    //       },
    //     },
    //     {
    //       skills: {
    //         contains: "react",
    //       },
    //     },
    //     {
    //       skills: {
    //         contains: "小程序",
    //       },
    //     },
    //     {
    //       skills: {
    //         contains: "jQuery",
    //       },
    //     },
    //     {
    //       skills: {
    //         contains: "jquery",
    //       },
    //     },
    //     {
    //       skills: {
    //         contains: "app",
    //       },
    //     },
    //     {
    //       skills: {
    //         contains: "App",
    //       },
    //     },
    //   ],
    // },
    // having: {
    //   cityName: {
    //     _count: {
    //       gte: 5,
    //     },
    //   },
    // },
  });
  return data.map((item) => {
    return {
      keyword: item.cityName,
      city: item.city,
      count: item._count.cityName,
    };
  });
};

// return [{}]
const skills = [
  // "html",
  // "css",
  // "javascript",
  "vue",
  "react",
  "小程序",
  "jQuery",
  // "node.js",
  // "webpack",
  // "App",
  // "angular",
  // "ajax",
];

// 工作经验
const experiences = [
  "在校/应届",
  "应届生",
  "经验不限",
  "一年以内",
  "1-3年",
  "3-5年",
  "5-10年",
  "10年以上",
];

// 学历
const degrees = [
  // "学历不限",
  // "初中及以下",
  "中专/中技",
  "高中",
  "大专",
  "本科",
  // "硕士",
  // "博士",
];

const groupCitySkills = async () => {
  const all = await prisma.job0905.findMany({ where: {} });

  const cities = _.uniq(all.map((item) => item.cityName)); // 获取不重复的城市名

  // console.log(_.uniq(cities));
  const data = [];

  cities.forEach((item) => {
    const cData = {};
    cData.name = item;
    const jobs = all.filter((job) => job.cityName == item); // 获取当前城市的岗位数据
    // 循环技能
    const cSkills = [];
    // cData.jobs = jobs.length;
    skills.forEach((skill) => {
      //
      cSkills.push({
        name: skill,
        count: jobs.filter((j) =>
          j.skills.toLowerCase().includes(skill.toLowerCase())
        ).length,

        // 统计学历对应的经验
        degrees: degrees.map((d) => {
          return {
            name: d,
            experiences: experiences.map((ex) => {
              return {
                name: ex,
                count: jobs.filter(
                  (j) =>
                    // j.cityName == item &&
                    j.jobDegree == d &&
                    j.jobExperience == ex &&
                    j.skills.toLowerCase().includes(skill.toLowerCase())
                ).length,
              };
            }),
          };
        }),
      });
    });
    cData.skills = cSkills;
    // if (jobs.length > 10) {
    data.push(cData);
    // }
  });
  return data;
};

const groupCityDegree = async () => {
  const degrees = (
    await prisma.job0905.findMany({
      select: {
        jobDegree: true,
      },
      distinct: ["jobDegree"],
    })
  ).map((item) => item.jobDegree);
  // console.log(degrees);
  const all = await prisma.job0905.findMany({ where: {} });
  const cities = _.uniq(all.map((item) => item.cityName)); // 获取不重复的城市名
  const data = [];

  cities.forEach((item) => {
    const cData = {};
    cData.name = item;
    const jobs = all.filter((job) => job.cityName == item); // 获取当前城市的岗位数据
    // 循环技能
    const cDegrees = [];
    // cData.jobs = jobs.length;
    degrees.forEach((cd) => {
      //
      cDegrees.push({
        name: cd,
        count: jobs.filter((j) =>
          j.jobDegree.toLowerCase().includes(cd.toLowerCase())
        ).length,
      });
    });
    cData.degrees = cDegrees;
    // if (jobs.length > 10) {
    data.push(cData);
    // }
  });
  return data;
};

const groupCitySalary = async () => {
  // const degrees = (
  //   await prisma.job0905.findMany({
  //     select: {
  //       salaryDesc: true,
  //     },
  //     distinct: ["salaryDesc"],
  //   })
  // ).map((item) => item.salaryDesc);
  // console.log(degrees);
  const all = await prisma.job0905.findMany({ where: {} });
  const cities = _.uniq(all.map((item) => item.cityName)); // 获取不重复的城市名
  const data = [];

  cities.forEach((item) => {
    const cData = {};
    cData.name = item;
    const jobs = all.filter((job) => job.cityName == item); // 获取当前城市的岗位数据
    // 循环技能
    const cDegrees = [];
    // cData.jobs = jobs.length;
    salaryRange.forEach((cd) => {
      //
      cDegrees.push({
        name: cd.min + "-" + cd.max + "K",
        count: jobs.filter((j) => {
          // j.salaryDesc.toLowerCase().includes(cd.toLowerCase()) {
          if (!j.salaryDesc.toLocaleLowerCase().includes("k")) {
            return cd.min === 1;
          } else {
            try {
              const tmpArr = j.salaryDesc.split("-");
              const tmpMin = tmpArr[0];
              const tmpMax = tmpArr[1].toLowerCase().split("k")[0];
              // console.log(tmpMin, tmpMax);
              if (cd.min <= tmpMin && tmpMax <= cd.max) {
                return true;
              } else {
                return false;
              }
            } catch (err) {
              return false;
            }
          }
        }).length,
      });
    });
    cData.degrees = cDegrees;
    // if (jobs.length > 10) {
    data.push(cData);
    // }
  });
  return data;
};

/**
 * 技能关键词
 * @returns
 */
const groupSkills = async () => {
  const all = await prisma.job0905.findMany({ where: {} });
  // const keys = new Set()
  const data = [
    // {
    //   keyword: "html",
    //   count: 0,
    // },
    // {
    //   keyword: "css",
    //   count: 0,
    // },
    // {
    //   keyword: "javascript",
    //   count: 0,
    // },
    {
      keyword: "vue",
      count: 0,
    },
    {
      keyword: "react",
      count: 0,
    },
    {
      keyword: "jQuery",
      count: 0,
    },
    // {
    //   keyword: "webpack",
    //   count: 0,
    // },
    // {
    //   keyword: "Node.js",
    //   count: 0,
    // },
    {
      keyword: "小程序",
      count: 0,
    },
    {
      keyword: "App",
      count: 0,
    },
    // {
    //   keyword: "angular",
    //   count: 0,
    // },
    // {
    //   keyword: "ajax",
    //   count: 0,
    // },
    // {
    //   keyword: "require.js",
    //   count: 0,
    // },
    // {
    //   keyword: "cocos",
    //   count: 0,
    // },
    // {
    //   keyword: "gis",
    //   count: 0,
    // },
    // {
    //   keyword: "three",
    //   count: 0,
    // },
  ];
  all.forEach((item) => {
    // if(data.findIndex(k=>item.skills.))
    data.forEach((d) => {
      if (item.skills.toLowerCase().includes(d.keyword.toLocaleLowerCase())) {
        d.count++;
      }
    });
  });
  return data;
};

module.exports = {
  groupDegree,
  groupSalary,
  groupCity,
  groupSkills,
  groupCitySkills,
  groupCityDegree,
  groupCitySalary,
};
